package qrcode

import (
	"autoDeploy/config"
	"autoDeploy/dao/redis"
	"context"
	"errors"
	"fmt"
	"log"
	"strconv"
	"time"
)

//	SetQRInfo
//
// 描述信息：[(将用户uid，二维码qrType)，二维码状态]，存入redis中
//
// Param：
//
//	userUID：用户uid
//	qrType：服务类型
//	status：二维码状态
//
// Return：
//
//	string：命令执行的结果
//	error：错误信息
func SetQRInfo(userUID, qrType, status string) (string, error) {
	//创建一个空的ctx
	ctx := context.Background()

	//创建redis客户端实例
	rdb, err := redis.CreateRedisClient(config.RedisAddr, config.RedisPassword, config.RedisDB)
	if err != nil {
		return "创建redis客户端实例失败", err
	}

	// 构建哈希键
	key := fmt.Sprintf("%s:%s", userUID, qrType)
	// 构建哈希数据
	hashData := map[string]interface{}{
		"status": status,
	}
	// 将哈希数据存入 Redis
	result, err := rdb.HMSet(ctx, key, hashData).Result()
	if err != nil {
		return "将哈希数据存入 Redis 失败", err
	}

	// 设置过期时间为1小时
	_, err = rdb.Expire(ctx, key, 1*time.Hour).Result()
	if err != nil {
		return "设置过期时间为1小时失败", err
	}

	//销毁redis客户端实例
	err = redis.DestroyRedisClient(rdb)

	if err != nil {
		return "销毁redis客户端实例失败", err
	}

	return strconv.FormatBool(result), nil
}

//	GetQrStatus
//
// 描述信息：根据用户uid和qrType，判断redis中是否有对应的status
//
// Param：
//
//	userUID ：用户uid
//	qrType：服务类型
//
// Return：
//
//	string ：二维码的状态；无则为空
//	error ：错误信息
func GetQrStatus(userUID, qrType string) (string, error) {
	// 构建哈希键
	key := fmt.Sprintf("%s:%s", userUID, qrType)
	//创建redis客户端实例
	rdb, err := redis.CreateRedisClient(config.RedisAddr, config.RedisPassword, config.RedisDB)
	//构建一个ctx对象
	ctx := context.Background()

	// 从 Redis 中获取 status
	status, err := rdb.HGet(ctx, key, "status").Result()
	if err != nil {
		if errors.Is(err, redis.Nil) {
			// 如果 Redis 中没有找到 status，返回空字符串
			return "", nil
		}
		log.Printf("service层：GetQrStatus函数从 Redis 中获取 status 失败: %v", err)
		return "", err
	}

	//销毁redis客户端实例
	err = redis.DestroyRedisClient(rdb)
	if err != nil {
		fmt.Println("service层：GetQrStatus函数销毁redis实例失败", err.Error())
		return "销毁redis客户端失败", err
	}
	return status, nil
}

//	UpdateRedisQrStatus
//
// 描述信息：（根据userUID，qrType），更新redis中二维码status的扫描状态
//
// Param：
//
//	userUID ：用户uid
//	qrType：服务类型
//	newStatus ：新状态
//
// Return：
//
//	error ：错误信息
func UpdateRedisQrStatus(userUID, qrType, newStatus string) error {
	rdb, err := redis.CreateRedisClient(config.RedisAddr, config.RedisPassword, config.RedisDB)
	if err != nil {
		return err
	}
	// 构建哈希键
	key := fmt.Sprintf("%s:%s", userUID, qrType)
	fmt.Println("service层构建的更新哈希键为：" + key)

	// 在 Redis 中更新 status
	result, err := rdb.HSet(context.Background(), key, "status", newStatus).Result()
	if err != nil {
		return err
	}
	fmt.Println("service层更新没问题")

	// 查询哈希以确认更新
	val, err := rdb.HGetAll(context.Background(), key).Result()
	if err != nil {
		// 处理错误
		return err
	}
	fmt.Println("service层更新后的哈希值：", val, result)

	//销毁redis实列
	err = redis.DestroyRedisClient(rdb)
	if err != nil {
		return err
	}

	// 检查是否成功更新了至少一个字段
	//if result != 1 {
	//	return fmt.Errorf("更新失败，可能的原因包括：键不存在，或字段已存在且未被修改")
	//}

	return nil
}
